
#include "CajaInterrogacion.h"
#include "../FabricasObjetosJuego.h"

const int EstadoCajaInterrogacion::Inactiva = 0;
const int EstadoCajaInterrogacion::Creando = 1;
const int EstadoCajaInterrogacion::Activa = 2;
const vector<int> EstadoCajaInterrogacion::accionesParticulares = make_vector<int>() << EstadoCajaInterrogacion::Inactiva;
const vector<string> EstadoCajaInterrogacion::descripcionAccionesParticulares = make_vector<string>() << "inactiva";

CajaInterrogacion::CajaInterrogacion(int x, int y, int maximoX, int maximoY) : ObjetoEstatico(x, y, maximoX, maximoY) {
	
	tiempoUltimaFabricacion = 0;
	srand( time(NULL) );
	
	estadoParticular = EstadoCajaInterrogacion::Activa;
	
	tipo = OBSTACULO;
}

void CajaInterrogacion::SacarBonus() {
	
	if (estadoParticular == EstadoCajaInterrogacion::Activa) 
		setEstadoParticular(EstadoCajaInterrogacion::Creando);
}

pair<idImagen_t, int> CajaInterrogacion::getDibujable(Uint32 time) {
	
	if (estadoParticular == EstadoCajaInterrogacion::Inactiva && time - tiempoUltimaFabricacion > LAPSUS_MINIMO_FABRICACIONES_CAJAINTERROGACION)
		setEstadoParticular(EstadoCajaInterrogacion::Activa);
		
	if (estadoParticular == EstadoCajaInterrogacion::Creando) {
		Orientacion orientacion = (rand() % 2 == 0) ? Derecha : Izquierda;
		FabricaBonus::CrearObjeto(posicion.getX(), posicion.getY(), orientacion);
		tiempoUltimaFabricacion = time;
		setEstadoParticular(EstadoCajaInterrogacion::Inactiva);
	}
	
	pair<idImagen_t, int> dibujable;
	
	if (estadoParticular == EstadoCajaInterrogacion::Activa) {
		dibujable = ObjetoEstatico::getDibujable(time);
	}
	else if (estadoParticular == EstadoCajaInterrogacion::Inactiva) {
		bool status;
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
	}
		
	return dibujable;	
}

void CajaInterrogacion::setEstadoParticular(int estadoParticular) {
	
	this->estadoParticular = estadoParticular;
}

void CajaInterrogacion::addAccionParticular(int idImagen, int cuadros) {
	Animacion *animacion = new Animacion (cuadros, 0, idImagen, ancho, alto);
    accionesParticulares.push_back(animacion);
}

void CajaInterrogacion::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	Personaje* per = dynamic_cast<Personaje*> (personaje);

	per->StartSonido (SonidosPersonaje::ColisionObstaculo);

	int ZONA_COLISION_X = per->getAncho() * 0.1;
	int ZONA_COLISION_Y = per->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (per->getVelocidadY() <= 0) {
			per->setVelocidadY(0);
			if (per->getEstado() == EstadoBasico::Saltando) per->setEstado(EstadoBasico::Quieto);
			per->setPosicion(per->getX(), getY() - per->getAlto());
		}
		else {
			SacarBonus();
			per->setVelocidadY(per->getVelocidadY() * (-1));
			per->setPosicion(per->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0) {
		if (per->getVelocidadX() < 0) per->setPosicion(getX() + getAncho() - ZONA_COLISION_X, per->getY());
		else per->setPosicion(getX() - per->getAncho() + ZONA_COLISION_X, per->getY());
	}
	else {
		if (colX >= colY) {
			if (per->getVelocidadY() < 0) {
				per->setVelocidadY(0);
				if (per->getEstado() == EstadoBasico::Saltando) per->setEstado(EstadoBasico::Quieto);
				per->setPosicion(per->getX(), getY() - per->getAlto());
			}
			else {
				SacarBonus();
				per->setVelocidadY(per->getVelocidadY() * (-1));
				per->setPosicion(per->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else {
			if (per->getVelocidadX() < 0) per->setPosicion(getX() + getAncho() - ZONA_COLISION_X, per->getY());
			else per->setPosicion(getX() - per->getAncho() + ZONA_COLISION_X, per->getY());
		}
	}
}

void CajaInterrogacion::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

	ObjetoMovible* mov = dynamic_cast<ObjetoMovible*> (movible);

	int ZONA_COLISION_Y = mov->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (mov->getVelocidadY() <= 0) {
			mov->setVelocidadY(0);
			mov->setPosicion(mov->getX(), getY() - mov->getAlto());
			if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
		}
		else {
			mov->setVelocidadY(mov->getVelocidadY() * (-1));
			mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0 ) mov->CambiarSentido(getX(), getAncho());

	else {
		if (colX >= colY) {
			if (mov->getVelocidadY() < 0) {
				mov->setVelocidadY(0);
				mov->setPosicion(mov->getX(), getY() - mov->getAlto());
				if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
			}
			else {
				mov->setVelocidadY(mov->getVelocidadY() * (-1));
				mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else mov->CambiarSentido(getX(), getAncho());
	}
}
